package tinyiotserver

// MessageHandler 消息处理
type MessageHandler interface {
	// OnReceive 处理接收到的消息。
	// 如果返回的newMessage为nil，则继续执行后续的Handler。
	// 如果newMessage的Type为RESPONSE，则直接将newMessage通知客户端，终止后续handler。
	// 如果newMessage不为nil，则将newMessage视为新的消息（或指令），放入队列。
	OnReceive(requestMsg *Message) (newMessage *Message)

	// OnResponse 当服务端向客户端返回消息时，执行。当存在多个MessageHandler时，按照注册时的反序执行。
	OnResponse(responseMsg *Message, requestMsg *Message) (replyToClientMsg *Message)
}

// HandlerRegistrar 消息处理器，注册中心。
type HandlerRegistrar interface {
	// RegisterGlobalPreHandler 注册全局的消息处理器，优先执行。
	RegisterGlobalPreHandler(handlers ...MessageHandler)

	// RegisterHandler 具体的消息处理器，在全局的消息处理器后执行。
	RegisterHandler(topic string, handlers ...MessageHandler)

	GetHandlers(topic string) []MessageHandler
}

// SuccessResponseMsgHandler POST请求，默认返回成功。
var SuccessResponseMsgHandler MessageHandler = &successResponseMsgHandler{}

// DefaultMsgHandler 默认消息处理，什么都不做。
var DefaultMsgHandler MessageHandler = &defaultMsgHandler{}

// POST请求，默认返回成功。
type successResponseMsgHandler struct {
	MsgHandlerAdapter
}

func (h *successResponseMsgHandler) OnReceive(requestMsg *Message) (newMsg *Message) {
	return SuccessMsg(string(requestMsg.Body.Topic))
}

// 默认消息处理，什么都不做。
type defaultMsgHandler struct {
	MsgHandlerAdapter
}

func (h *defaultMsgHandler) OnReceive(requestMsg *Message) (newMsg *Message) {
	return requestMsg
}

// MsgHandlerAdapter 实现了默认的OnResponse方法。
type MsgHandlerAdapter struct {
}

func (h MsgHandlerAdapter) OnResponse(responseMsg *Message, requestMsg *Message) (replyToClientMsg *Message) {
	return responseMsg
}
